﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entidades;
using System.Data.SqlClient;
namespace AccesoBD
{
    public class Cargos
    {


        public static bool registrarAltaCargo(Cargo oC)
        {
            bool res = false;
            SqlConnection con = DB.Conectar();
            SqlTransaction tran = null;
            tran = con.BeginTransaction();
            try
            {
                string comando = "insert into Cargo (idCargo, nombre, descripcion, fechaAlta) values(@idCargo, @nombre, @descripcion, @fechaAlta)";
                List<SqlParameter> Listp = new List<SqlParameter>();
                oC.idCargo = obtenerUltimoId(tran, con) + 1;
                Listp.Add(new SqlParameter("@idCargo", oC.idCargo));
                Listp.Add(new SqlParameter("@nombre", oC.nombre));
                Listp.Add(new SqlParameter("fechaAlta", oC.fechaAlta));
                if (oC.descripcion.ToString().Equals(""))
                {
                    Listp.Add(new SqlParameter("@descripcion", DBNull.Value));

                }
                else
                {
                    Listp.Add(new SqlParameter("@descripcion", oC.descripcion));

                }
                int result = DB.EjecutarCommand(comando, Listp, con, tran);
                if (result > 0)
                {
                    res = true;
                    tran.Commit();
                }

            }
            catch (Exception Ex)
            {
                if (tran != null)
                {
                    tran.Rollback();
                }
                throw new Exception("Error al tratar de registrar un cargo: " + Ex.Message);
            }
            finally
            {
                con.Close();

            }
            return res;
        }
        public static bool modificarCargo(Cargo oc)
        {
            bool resultado = false;
            SqlConnection con = DB.Conectar();
            SqlTransaction tran = null;
            tran = con.BeginTransaction();

            try
            {
                string comando = "Update Cargo set nombre=@nombre, descripcion=@descripcion where idCargo=@idCargo";
                List<SqlParameter> listp = new List<SqlParameter>();
                listp.Add(new SqlParameter("@nombre", oc.nombre));
                listp.Add(new SqlParameter("@descripcion", oc.descripcion));
                listp.Add(new SqlParameter("@idCargo", oc.idCargo));
                int res = DB.EjecutarCommand(comando, listp, con, tran);
                if (res > 0)
                {
                    tran.Commit();
                    resultado = true;
                }


            }
            catch (Exception Ex)
            {
                if (tran != null)
                {
                    tran.Rollback();
                }
                throw new Exception("Error al modificar cargo " + Ex.Message);
            }
            finally
            {
                con.Close();
            }

            return resultado;

        }
        public static List<Cargo> obtenerTodosActivos()
        {
            List<Cargo> listCargo = new List<Cargo>();
            SqlConnection con = DB.Conectar();
            try
            {
                string comando = "select * from Cargo where fechaBaja is null";
                List<SqlParameter> listp = new List<SqlParameter>();
                SqlDataReader dr = DB.GenerarReader(comando, listp, con);
                while (dr.Read())
                {
                    Cargo oC = new Cargo();
                    oC.idCargo = int.Parse(dr["idCargo"].ToString());
                    oC.nombre = dr["nombre"].ToString();
                    if (dr["fechaAlta"] != DBNull.Value)
                    {
                        oC.fechaAlta = DateTime.Parse(dr["fechaAlta"].ToString());
                    }
                    if (dr["descripcion"] != DBNull.Value)
                    {
                        oC.descripcion = dr["descripcion"].ToString();
                    }


                    listCargo.Add(oC);



                    oC = null;

                }
            }
            catch (Exception Ex)
            {

                throw new Exception("Error al obtener cargos los cargos: " + Ex.Message);
            }
            finally
            {
                con.Close();
            }

            return listCargo;
        }
        public static Cargo obtenerCargoActivo(int idCargo)
        {
            Cargo oC = null;
            SqlConnection con = DB.Conectar();
            try
            {
                string comando = "select * from Cargo where fechaBaja is null and idCargo=@idCargo";
                List<SqlParameter> listp = new List<SqlParameter>();
                listp.Add(new SqlParameter("@idCargo", idCargo));
                SqlDataReader dr = DB.GenerarReader(comando, listp, con);
                if (dr.Read())
                {
                    oC = new Cargo();
                    oC.idCargo = int.Parse(dr["idCargo"].ToString());
                    oC.nombre = dr["nombre"].ToString();
                    oC.fechaAlta = DateTime.Parse(dr["fechaAlta"].ToString());
                    if (dr["descripcion"] != DBNull.Value)
                    {
                        oC.descripcion = dr["descripcion"].ToString();
                    }


                }
            }
            catch (Exception Ex)
            {

                throw new Exception("Error al obtener cargos los cargos: " + Ex.Message);
            }
            finally
            {
                con.Close();
            }

            return oC;
        }
        private static int obtenerUltimoId(SqlTransaction tran, SqlConnection con)
        {
            int idCargo = 0;

            try
            {
                string comando = "select Max(idCargo) from Cargo";
                List<SqlParameter> listp = new List<SqlParameter>();
                string num = DB.EjecutarScalar(comando, listp, con, tran);
                if (!string.IsNullOrEmpty(num))
                {
                    idCargo = int.Parse(num.ToString());
                }
            }
            catch (Exception Ex)
            {

                throw new Exception("Error al obtener id cargo: " + Ex.Message);
            }
            return idCargo;

        }
        public static bool validarExistencia(string nombre)
        {
            bool resultado = false;
            SqlConnection con = DB.Conectar();
            try
            {
                string comando = "Select * from Cargo where nombre=@nombre";

                List<SqlParameter> listp = new List<SqlParameter>();
                listp.Add(new SqlParameter("@nombre", nombre));

                SqlDataReader dr = DB.GenerarReader(comando, listp, con);

                if (dr.Read())
                {
                    resultado = true;
                }

            }
            catch (Exception Ex)
            {

                throw new Exception("Error al buscar un cargo existente: " + Ex.Message);
            }
            finally
            {
                con.Close();
            }
            return resultado;
        }
        public static Cargo obtenerCargo(long idCargo)
        {
            SqlConnection con = DB.Conectar();
            Cargo oC = null;
            try
            {
                string comando = "select * from Cargo where  idCargo=@idCargo";
                List<SqlParameter> listp = new List<SqlParameter>();
                listp.Add(new SqlParameter("@idCargo", idCargo));
                SqlDataReader dr = DB.GenerarReader(comando, listp, con);

                if (dr.Read())
                {
                    oC = new Cargo();
                    oC.idCargo = int.Parse(dr["idCargo"].ToString());
                    oC.nombre = dr["nombre"].ToString();
                    if (dr["fechaAlta"] != DBNull.Value)
                    {
                        oC.fechaAlta = DateTime.Parse(dr["fechaAlta"].ToString());
                    }
                    if (dr["descripcion"] != DBNull.Value)
                    {
                        oC.descripcion = dr["descripcion"].ToString();
                    }
                    if (dr["fechaBaja"] != DBNull.Value)
                    {
                        oC.fechaBaja = DateTime.Parse(dr["fechaBaja"].ToString());
                    }

                }

            }
            catch (Exception Ex)
            {

                throw new Exception("Error al obtener Cargo" + Ex.Message);
            }
            finally
            {
                con.Close();
            }
            return oC;
        }
        public static List<Cargo> busquedaCargoPorNombreYFecha(string nomCargo, DateTime? fechaDesde)
        {
            List<Cargo> lstCargo = new List<Cargo>();
            SqlConnection con = DB.Conectar();
            SqlCommand cmd = null;
            Cargo oC = null;

            try
            {
                string comando = "select * from Cargo where fechaBaja is null ";
                if (nomCargo != "" && fechaDesde != null)
                {
                    comando += "and  nombre LIKE '%" + nomCargo + "%' and fechaAlta>@fechaDesde";

                    cmd = new SqlCommand(comando, con);
                    cmd.Parameters.Add(new SqlParameter("@fechaDesde", fechaDesde));

                }
                else if (nomCargo != "")
                {
                    comando += "and  nombre LIKE '%" + nomCargo + "%'";
                    cmd = new SqlCommand(comando, con);
                }
                else if (fechaDesde != null)
                {
                    comando += "and  fechaAlta>@fechaDesde";
                    cmd = new SqlCommand(comando, con);
                    cmd.Parameters.Add(new SqlParameter("@fechaDesde", fechaDesde));
                }
                else
                {
                    cmd = new SqlCommand(comando, con);
                }
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    oC = new Cargo();
                    oC.idCargo = int.Parse(dr["idCargo"].ToString());
                    oC.nombre = dr["nombre"].ToString();
                    oC.fechaAlta = DateTime.Parse(dr["fechaAlta"].ToString());
                    if (dr["descripcion"] != DBNull.Value)
                    {
                        oC.descripcion = dr["descripcion"].ToString();
                    }
                    if (dr["fechaBaja"] != DBNull.Value)
                    {
                        oC.fechaBaja = DateTime.Parse(dr["fechaBaja"].ToString());
                    }
                    lstCargo.Add(oC);
                    oC = null;

                }

            }
            catch (Exception Ex)
            {

                throw new Exception("Error al obtener Cargo" + Ex.Message);
            }
            finally
            {
                con.Close();
            }
            return lstCargo;

        }
        public static bool registrarBaja(Cargo oC)
        {
            bool resultado = false;
            SqlConnection con = DB.Conectar();
            SqlTransaction tran = null;
            tran = con.BeginTransaction();
            try
            {
                string comando = "Update Cargo set fechaBaja=@fechaBaja where idCargo=@idCargo";
                List<SqlParameter> listp = new List<SqlParameter>();
                listp.Add(new SqlParameter("@fechaBaja", oC.fechaBaja));
                listp.Add(new SqlParameter("@idCargo", oC.idCargo));
                int res = DB.EjecutarCommand(comando, listp, con, tran);
                if (res > 0)
                {
                    tran.Commit();
                    resultado = true;
                }
            }
            catch (Exception Ex)
            {
                if (tran != null)
                {
                    tran.Rollback();
                }
                throw new Exception("Error al registrar la baja: " + Ex.Message);
            }
            finally
            {
                con.Close();
            }
            return resultado;
        }
        public static List<Cargo> obtenerTodos()
        {
            List<Cargo> listCargo = new List<Cargo>();
            SqlConnection con = DB.Conectar();
            try
            {
                string comando = "select * from Cargo";
                List<SqlParameter> listp = new List<SqlParameter>();
                SqlDataReader dr = DB.GenerarReader(comando, listp, con);
                while (dr.Read())
                {
                    Cargo oC = new Cargo();
                    oC.idCargo = int.Parse(dr["idCargo"].ToString());
                    oC.nombre = dr["nombre"].ToString();
                   // oC.fechaAlta = DateTime.Parse(dr["fechaAlta"].ToString());
                    if (dr["descripcion"] != DBNull.Value)
                    {
                        oC.descripcion = dr["descripcion"].ToString();
                    }

                    listCargo.Add(oC);
                    oC = null;

                }
            }
            catch (Exception Ex)
            {

                throw new Exception("Error al obtener cargos los cargos: " + Ex.Message);
            }
            finally
            {
                con.Close();
            }

            return listCargo;
        }
    }
}
